package cn.java.lambda.test3;

import java.util.function.*;

/**
 * 测试实例方法引用
 * @author 攀博课堂(www.pbteach.com)
 * @version 1.0
 **/
public class TestInstanceFun {
    public static void main(String[] args) {
        test3();

    }
    //特定实例方法引用，引用某个对象的实例方法
    public static void test1(){
      //创建一个对象
        PbStudent s1 = new PbStudent();
        s1.setNickname("攀博课堂");

        //引用s1对象的getNickname方法，方法引用赋值给Supplier函数接口 ,它的 T get();抽象方法与getNickname一致
        Supplier<String> fun1 =  s1::getNickname;

        //获取学生昵称，fun1.get()相当于调用了s1对象的getNickname
        System.out.println(fun1.get());

        //引用s1对象的setNickname
        Consumer<String> fun2 =  s1::setNickname;
        System.out.println("设置学生昵称");
        fun2.accept("攀博课堂www.pbteach.com");
        System.out.println("学生新昵称："+fun1.get());


    }

    //任意实例方法引用
    public static void test2(){

        //引用PbStudent类型的任意对象的setNickname方法
        BiConsumer<PbStudent, String> setNickname =  PbStudent::setNickname;

        //引用PbStudent类型的任意对象的getNickname方法
        Function<PbStudent,String> getNickname = PbStudent::getNickname;

        //通过setNickname方法引用设置昵称
        PbStudent s1 = new PbStudent();
        setNickname.accept(s1,"攀博课堂");
        //通过getNickname方法引用获取昵称
        String nickName = getNickname.apply(s1);
        System.out.println(nickName);

//        System.out.println(s1.getNickname());

    }

    //测试任意对象实例方法的引用，测试String 类型下的charAt方法
    public static void test3(){
        //引用String 类型下的charAt方法
        BiFunction<String,Integer,Character> fun = String::charAt;

        System.out.println(fun.apply("www.pbteach.com",4));
        System.out.println(fun.apply("www.pbteach.com",5));
    }
}
